Ext.define('cp.view.grid.GestionBase', {
    extend: 'Ext.grid.Panel',
    alias: 'widget.gestionBase',
    width: 635,
    height: 400,
    
    /* Variables de instancia */
    stage: 'Base',
    initComponent: function(){
        
        // El store entra por parametro
        this.store = this.dataStore;
        
        this.stripeRows = true;
        /* La dejo vacia porque sino no puedo extender las columnas desde
         * una subclase
         */
        this.columns = [];
        
        this.dockedItems = [
            {
                xtype: 'toolbar',
                dock: 'top',
                itemId: 'top-toolbar',
                items: [
                    
                    {xtype: 'button', text: 'Buscar', iconCls: 'ico-search', action: 'search'},
                    {xtype: 'button', text: 'Ver', iconCls: 'ico-show', action: 'show'},
                    {xtype: 'button', text: 'Añadir', iconCls: 'ico-add', action: 'add'},
                    {xtype: 'button', text: 'Borrar', iconCls: 'ico-delete', action: 'delete'},
                    {xtype: 'button', text: 'Recuperar', iconCls: 'ico-undelete', action: 'undelete', itemId: 'undelete-btn'}
                    
                ]
            }
        ];
        
        var me = this;
        this.bbar = Ext.create('Ext.PagingToolbar',{
                store: me.store,
                beforePageText: 'Página',
                afterPageText: 'de {0}',
                displayMsg: 'Mostrando {0} - {1} de {2} registros',
                emptyMsg: 'No hay datos que mostrar',
                dock: 'bottom',
                displayInfo: true,
                pageSize: 21
            });
            
        this.callParent(arguments);
    },
    
    // Devuelve true si hay una fila seleccionada.
    hayFilaSeleccionada: function(){
        var select = this.getSelectionModel();
        if(select.getCount() === 0){
            return false;
        }else{
            return true;
        }
    },
    
    // Devuelve la fila seleccionada.
    filaSeleccionada: function(){
        var row = this.getSelectionModel().getSelection();
        return row[0];
    },
    // Muestra error de fila no seleccionada.
    mostrarErrNoSeleccion: function(){
        Ext.create('cp.view.ui.AlertErr',{
            mensaje: 'Debe seleccionar un '+this.stage.toLowerCase()+' para realizar la operación.'
        }).showDialog();
    },
    
    // Muestra el error cuando se intenta borrar un item ya eliminado.
    mostrarErrItemInactivo: function(){
        Ext.create('cp.view.ui.AlertErr',{
            mensaje: 'No se puede editar un '+this.stage.toLowerCase()+' inactivo.'
        }).showDialog();
    },
    aplicarFiltrado: function(valor){
        this.getStore().load({params:{filter: valor}});
    },
    
    // Despacha el proceso de recuperacion de un item.
    recuperarItem: function(){
        if(this.hayFilaSeleccionada()){
            Ext.create('cp.view.ui.UndeleteConfirm',{
                mensaje: "¿Está seguro de recuperar al " + this.stage.toLowerCase() + " " +
                this.filaSeleccionada().get('apellido') + ", " + this.filaSeleccionada().get('nombre') +
                " del sistema?",
                target: this
            }).showDialog();
        }else{
            this.mostrarErrNoSeleccion();
        }
    },
    
    // Despacha el proceso de borrado a la subclase.
    borrarItem: function(){
        if(this.hayFilaSeleccionada()){
            Ext.create('cp.view.ui.DeleteConfirm',{
                mensaje: "¿Está seguro de eliminar al " + this.stage.toLowerCase() + " " +
                this.filaSeleccionada().get('apellido') + ", " + this.filaSeleccionada().get('nombre') +
                " del sistema?",
                target: this
            }).showDialog();
        }else{
            this.mostrarErrNoSeleccion();
        }
    },
    recuperarItemPorId: function(itemId){
        var me = this;
        Ext.Ajax.request({
            method: 'POST',
            url: this.undeleteUrl,
            params:{
                id: itemId
            },
            success: function(response){
                var re = Ext.JSON.decode(response.responseText);
                if(re.success){
                    Ext.create('cp.view.ui.AlertOk',{mensaje:re.msg}).showDialog();
                    me.getStore().load();
                }else{
                    Ext.create('cp.view.ui.AlertErr',{mensaje:re.msg}).showDialog();
                }
            }
        });
    },
    borrarItemPorId: function(itemId){
        var me = this;
        Ext.Ajax.request({
            method: 'POST',
            url: this.deleteUrl,
            params:{
                id: itemId
            },
            success: function(response){
                var re = Ext.JSON.decode(response.responseText);
                if(re.success){
                    Ext.create('cp.view.ui.AlertOk',{mensaje:re.msg}).showDialog();
                    me.getStore().load();
                }else{
                    Ext.create('cp.view.ui.AlertErr',{mensaje:re.msg}).showDialog();
                }
            }
        });
    }
});